/*
 * Ejercicio realizado por Francisco Gonzalez-Armijo Riádigos
 * para la prueba de seleccion de http://www.nomasystems.es
 */

package es.kuassivi.android.cd.api;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import android.util.Log;
import es.kuassivi.android.cd.settings.CorporateDirectoryException;

/**
 * Clase que gestiona los GETs de la API REST
 * 
 * @author kuassivi <a href="mailto:kuassivi@gmail.com">kuassivi@gmail.com</a>
 * @since 0.1
 */
public class RESTGetResponse extends AbstractREST
{

	public static final String TAG = "RESTGetResponse";
	
	private String mRestUrl;
	
    private AbstractRESTCallback mCallback;

    /**
     * Crea una nueva instancia de RESTGetResponse con la url hacia el servidor, 
     * y la funcion callback que se ejecutara con los datos obtenidos
     * 
     * @param restUrl URL para tratar en el API REST
     * @param callback El callback que se invoca cuando se ha completado la peticion
     * 
     */
    public RESTGetResponse(String restUrl, AbstractRESTCallback callback)
    {
    	Log.v(TAG, "Current State: RESTGetResponse()");
    	
        this.mRestUrl = restUrl;
        
        this.mCallback = callback; 
    }
    
	@Override
	protected String doInBackground(String... params) 
	{
		String response = null;
		
		HttpResponse res;
		
		// Realizamos la peticion
		try {
			
			res = getResponse(mRestUrl);
			
			checkResponse(res, 200);
			
			HttpEntity entity = res.getEntity();
			
			if(null != entity)
				response = EntityUtils.toString(entity);
			
		} catch (Exception e) {
			
			//e.printStackTrace();
			
			Log.w(TAG, CorporateDirectoryException.EMPTY_RESULTS_DATA
					+ "\nErrorMessage: " + e.getMessage() );
			
			return null;
			
		}
		
		// Devuelve el HTTP Response en formato String
		return response;
	}


    @Override
    protected void onPostExecute(String result) 
    {
        try {
			mCallback.onComplete(result);
		} catch (Exception e) {
			// TODO: [onPostExecute] Generar Exception
			//e.printStackTrace();
		}
        
        super.onPostExecute(result);
    }
    
    
	/**
	 * Obtiene la HttpResponse en base a la url especificada
	 * 
	 * @param restUrl String
	 * @return HttpResponse
	 * @throws ClientProtocolException
	 * @throws IOException
	 */
	@Override
    public HttpResponse getResponse(String restUrl) 
								throws ClientProtocolException, IOException
	{
		HttpClient client = new DefaultHttpClient();
		
		HttpGet method = new HttpGet(restUrl);
		
		method.addHeader("accept", "application/json");
		
		HttpResponse res = client.execute(method);

		return res;
	}
	
	/**
	 * Verificamos la respuesta del servidor
	 * <br /><i> 200, OK </i> Este codigo de respuesta indica que el servidor nos devuelve datos
	 * 
	 * @param response HttpResponse
	 * @param codeToCheck int
	 * @throws ParseException
	 * @throws IOException
	 * @throws Exception
	 */
	@Override
	public void checkResponse(HttpResponse response, int codeToCheck)
						throws ParseException, IOException, Exception 
	{
		if (response.getStatusLine().getStatusCode() != codeToCheck){
			
			throw new Exception( response.getStatusLine().getReasonPhrase()
					+ "\n" + EntityUtils.toString( response.getEntity() ) );
			
		}
		
		// TODO: [checkResponse] Implementar resultados segun la respuesta del servidor
		// 403 Forbidden
		// 500 Internal Server Error
		// ...
	}
 
}
